2025-11-18
데이터 레이어
국가 경계, 호수, 그래티큘: 벡터(vector) 데이터
인구밀도, 수심: 래스터(raster) 데이터
데이터 원천
Natural Earth Data: 국가 경계, 호수, 그래티큘, 수심
NASA’s Socioeconomic Data and Applications Center (SEDAC): 인구 밀도
투영법: 로빈슨 도법(Robinson projection)
지도화 기법: 컬러, 범례, 주기 표기 등
벡터(vector) 데이터
포인트, 라인, 폴리곤
형상 데이터 + 속성 데이터
래스터(raster) 데이터
그리드 셀(grid cell)
일체형
벡터 데이터: 형상 데이터 + 속성 데이터
형상 데이터 (기하, 도형, 공간 데이터)
지리공간적 객체 자체에 대한 데이터
포인트(점), 라인(선), 폴리곤(면)으로 구분
버텍스(vertex)의 좌표값
속성 데이터
지리공간적 객체가 보유한 속성
기존 일반 데이터와 동일
| 구분 | 함수 |
|---|---|
| 읽고 쓰기 |
st_read(), st_write(), read_sf(), write_sf()
|
| 투영 관련 |
st_crs(), st_transform()
|
| 기하 측정 |
st_area(), st_length(), st_perimeter(), st_distance()
|
| 기하 변형 |
st_centroid(), st_buffer(), st_boundary(), st_simplify()
|
| 기하 생성 |
st_point(), st_voronoi() , st_convex_hull(), st_make_grid()
|
| 기하 검토 |
st_is_valid(), st_make_valid()
|
| 기하 중첩 |
st_filter(), st_intersection(), st_union(), st_crop()
|
| 기타 |
st_coordinates(), st_cast(), st_as_sf(), st_graticule(), st_join()
|
속성 데이터
csv 파일: readr 패키지의 read_csv() 함수
엑셀 파일: readxl 패키지의 read_excel() 함수
Open API를 통해 수집: tibble 객체
형상 데이터와 속성 데이터의 결합: dplyr 패키지의 left_join() 함수
왼편: 형상 데이터
오른편: 속성 데이터
데이터 형식
패키지: terra 패키지
불러오기: rast()
변환하기: project(), mosaic(), crop()
계산하기: global(), focal(), zonal()
수 많은 다른 함수들
https://datacarpentry.github.io/organization-geospatial/03-crs.html
PROJ 정형문자열
EPSG 숫자코드
| 투영법 | PROJ 파라미터 |
|---|---|
| 정적원통 도법 Equal Area Cylindrical | +proj=cea |
| 컴펙트 밀러 도법 Compact Miller | +proj=comill |
| 에케르트 IV 도법 Eckert IV | +proj=eck4 |
| 정거원통 도법 Equidistant Cylindrical | +proj=eqc |
| 구드 도법 Goode Homolosine | +proj=goode |
| 단열형 구드 도법 Interrupted Goode Homolosine | +proj=igh |
| 메르카토르 도법 Mercator | +proj=merc |
| 몰바이데 도법 Mollweide | +proj=moll |
| 로빈슨 도법 Robinson | +proj=robin |
| 시뉴소이드 도법 Sinusoidal | +proj=sinu |
| 빈켈트리펠 도법 Winkel Tripel | +proj=wintri |
| 적용 스케일 | EPSG 숫자코드 | 설명 |
|---|---|---|
| 전세계 | EPSG:4326 | WGS84, 측지좌표계, GPS에 사용 |
| EPSG:3857 | 웹 메르카토르 도법, 구글 맵스, 오픈스트리트맵에서 사용 | |
| EPSG:7789 | ITRF2014 | |
| 미국 | EPSG:2163 | 알베르스 정적원추 도법 |
| 유럽 | EPSG:3035 | 람베르트 정적방위 도법 |
| 우리나라 | EPSG:5179 | UTM-K |
| EPSG:5185 | 서부원점 | |
| EPSG:5186 | 중부원점 | |
| EPSG:5187 | 동부원점 | |
| EPSG:5188 | 동해원점 |
ggplot() +
geom_sf(data = world) +
geom_sf(data = ne_bbox, fill = NA) +
coord_sf(crs = "+proj=eqc") +
scale_x_continuous(breaks = seq(-180, 180, 30)) +
scale_y_continuous(breaks = c(-89.9, seq(-60, 60, 30), 89.9)) +
theme(
panel.background = element_rect("white"),
panel.grid = element_line(color = "gray80")
)
ggplot() +
geom_sf(data = world) +
geom_sf(data = ne_bbox, fill = NA) +
coord_sf(crs = "+proj=comill") +
scale_x_continuous(breaks = seq(-180, 180, 30)) +
scale_y_continuous(breaks = c(-89.9, seq(-60, 60, 30), 89.9)) +
theme(
panel.background = element_rect("white"),
panel.grid = element_line(color = "gray80")
)
ggplot() +
geom_sf(data = world) +
geom_sf(data = ne_bbox, fill = NA) +
coord_sf(crs = "+proj=robin") +
scale_x_continuous(breaks = seq(-180, 180, 30)) +
scale_y_continuous(breaks = c(-89.9, seq(-60, 60, 30), 89.9)) +
theme(
panel.background = element_rect("white"),
panel.grid = element_line(color = "gray80")
)
ggplot() +
geom_sf(data = world) +
geom_sf(data = ne_bbox, fill = NA) +
coord_sf(crs = "+proj=eck4") +
scale_x_continuous(breaks = seq(-180, 180, 30)) +
scale_y_continuous(breaks = c(-89.9, seq(-60, 60, 30), 89.9)) +
theme(
panel.background = element_rect("white"),
panel.grid = element_line(color = "gray80")
)
정적(static) 지도
동적(animated) 지도
인터랙티브(interactive) 지도
plotly 패키지의 ggplotly() 함수
ggiraph 패키지
leaflet 패키지: Leaflet JS 라이브러리의 래퍼 패키지
world_map <- ggplot() +
geom_sf(data = world_data, aes(fill = TFR, text = name_long)) +
coord_sf(crs = "+proj=robin") +
scale_fill_viridis_c() +
scale_x_continuous(breaks = seq(-180, 180, 30)) +
scale_y_continuous(breaks = c(-89.5, seq(-60, 60, 30), 89.5)) +
theme(
panel.background = element_rect("white"),
panel.grid = element_line(color = "gray80")
)
world_map
library(tmap)
tm_world_map <- tm_shape(world_data, crs = "+proj=robin") +
tm_graticules(
labels.show = FALSE,
x = seq(-180, 180, 30),
y = c(-89.5, seq(-60, 60, 30), 89.5)
) +
tm_polygons(
fill = "TFR",
fill.scale = tm_scale_continuous(values = "viridis")
) +
tm_layout(frame = FALSE)
tm_world_map
library(ggspatial)
sigungu_data <- sigungu_data |>
mutate(
index_class = case_when(
index < 0.2 ~ "1",
index >= 0.2 & index < 0.5 ~ "2",
index >= 0.5 & index < 1.0 ~ "3",
index >= 1.0 & index < 1.5 ~ "4",
index >= 1.5 ~ "5"
),
index_class = fct(index_class, levels = as.character(1:5))
)
class_color <- c("1" = "#d7191c", "2" = "#fdae61",
"3" = "#ffffbf", "4" = "#a6d96a",
"5" = "#1a9641")
ggplot_map <- ggplot() +
geom_sf(
data = sigungu_data,
aes(fill = index_class, text = SGG1_FNM),
show.legend = TRUE
) +
geom_sf(
data = sido_shp,
fill = NA,
lwd = 0.5
) +
scale_fill_manual(
name = "Classes",
labels = c("< 0.2", "0.2 ~ 0.5", "0.5 ~ 1.0",
"1.0 ~ 1.5", ">= 1.5"),
values = class_color, drop = FALSE
) +
annotation_scale(
location = "br",
bar_cols = c("gray40", "white"),
width_hint = 0.4
)
ggplot_map
class_color <- c("#d7191c", "#fdae61", "#ffffbf", "#a6d96a", "#1a9641")
tmap_map <- tm_graticules(labels.cardinal = TRUE) +
tm_shape(sigungu_data) +
tm_polygons(
fill = "index", id = "SGG1_FNM",
fill.scale = tm_scale_intervals(
values = class_color,
breaks = c(0, 0.2, 0.5, 1.0, 1.5, Inf),
labels = c("< 0.2", "0.2 ~ 0.5", "0.5 ~ 1.0",
"1.0 ~ 1.5", ">= 1.5")
),
fill.legend = tm_legend(title = "Classes")
) +
tm_shape(sido_shp) + tm_borders(lwd = 1.5) +
tm_scalebar(breaks = seq(0, 200, 50))
tmap_map
ggplotly() 함수library(ggiraph)
sigungu_data <- sigungu_data |>
mutate(
index = format(index, digits = 4, nsmall = 4),
my_tooltip = str_c("Name: ", SGG1_FNM, "\n Index: ", index)
)
gg <- ggplot() +
geom_sf_interactive(
data = sigungu_data,
aes(fill = index_class, tooltip = my_tooltip, data_id = SGG1_FNM),
show.legend = TRUE
) +
geom_sf(data = sido_shp, fill = NA, lwd = 0.5) +
scale_fill_manual(
name = "Classes",
labels = c("< 0.2", "0.2 ~ 0.5", "0.5 ~ 1.0", "1.0 ~ 1.5", ">= 1.5"),
values = class_color, drop = FALSE
)
girafe(ggobj = gg) |>
girafe_options(opts_hover(css = "fill: gray"))library(leaflet)
world_data <- world_data |> filter(!is.na(TFR))
bins <- c(0, 1.5, 2.1, 3, 4, 5, Inf)
pal <- colorBin("YlOrRd", domain = world_data$TFR, bins = bins)
labels <- sprintf("<strong>%s</strong><br/>%g",
world_data$name_long, world_data$TFR) |> lapply(htmltools::HTML)
leaflet(world_data) |>
addProviderTiles(providers$Esri.WorldTopoMap) |>
addPolygons(
fillColor = ~pal(TFR), weight = 2, opacity = 1, color = "white",
dashArray = "3", fillOpacity = 0.6,
highlightOptions = highlightOptions(
weight = 5, color = "#666", dashArray = "",
fillOpacity = 0.6, bringToFront = TRUE
),
label = labels,
labelOptions = labelOptions(
style = list("font-weight" = "normal", padding = "3px 8px"),
textsize = "15px", direction = "auto"
)
) |>
addLegend(
pal = pal, values = ~TFR, opacity = 0.6, title = NULL, position = "bottomright"
)library(leaflet)
world_data <- world_data |> filter(!is.na(TFR))
bins <- c(0, 1.5, 2.1, 3, 4, 5, Inf)
pal <- colorBin("YlOrRd", domain = world_data$TFR, bins = bins)
labels <- sprintf("<strong>%s</strong><br/>%g",
world_data$name_long, world_data$TFR) |> lapply(htmltools::HTML)
leaflet(world_data) |>
addProviderTiles(providers$Esri.WorldTopoMap) |>
addPolygons(
fillColor = ~pal(TFR), weight = 2, opacity = 1, color = "white",
dashArray = "3", fillOpacity = 0.6,
highlightOptions = highlightOptions(
weight = 5, color = "#666", dashArray = "",
fillOpacity = 0.6, bringToFront = TRUE
),
label = labels,
labelOptions = labelOptions(
style = list("font-weight" = "normal", padding = "3px 8px"),
textsize = "15px", direction = "auto"
)
) |>
addLegend(
pal = pal, values = ~TFR, opacity = 0.6, title = NULL, position = "bottomright"
)library(tmap)
class_color <- c("#d7191c", "#fdae61", "#ffffbf", "#a6d96a", "#1a9641")
sigungu_data <- sigungu_data |> mutate(index = as.numeric(index))
tmap_mode(mode = "view")
my_tmap <- tm_shape(sigungu_data) +
tm_polygons(
fill = "index", fill_alpha = 0.6, col_alpha = 0.5,
popup.vars = c("지역소멸위험지수: " = "index"),
popup.format = list(index = list(digits = 3)),
id = "SGG1_FNM",
fill.scale = tm_scale_intervals(
values = class_color, breaks = c(0, 0.2, 0.5, 1.0, 1.5, Inf),
labels = c("< 0.2", "0.2~0.5", "0.5~1.0", "1.0~1.5", ">= 1.5")
),
fill.legend = tm_legend(title = "Classes")
) +
tm_shape(sido_shp) + tm_borders(lwd = 2)
my_tmapclass_color <- c("#d7191c", "#fdae61", "#ffffbf", "#a6d96a", "#1a9641")
sigungu_data <- sigungu_data |> mutate(index = as.numeric(index))
tmap_mode(mode = "view")
my_tmap <- tm_shape(sigungu_data) +
tm_polygons(
fill = "index", fill_alpha = 0.6, col_alpha = 0.5,
popup.vars = c("지역소멸위험지수: " = "index"),
popup.format = list(index = list(digits = 3)),
id = "SGG1_FNM",
fill.scale = tm_scale_intervals(
values = class_color, breaks = c(0, 0.2, 0.5, 1.0, 1.5, Inf),
labels = c("< 0.2", "0.2~0.5", "0.5~1.0", "1.0~1.5", ">= 1.5")
),
fill.legend = tm_legend(title = "Classes")
) +
tm_shape(sido_shp) + tm_borders(lwd = 2)
my_tmaphttps://www.geeksforgeeks.org/artificial-intelligence/large-language-model-llm/
LLM을 웹 인터페이스에서 사용하는 것이 아니라, 코드로 직접 제어하고 자동화하는 방식
API(Application Programming Interface, 응용프로그램 프로그래밍 인터페이스)
응용프로그램(예: 웹 앱)이 프로그래밍을 통해 다른 프로그램이나 서비스(예: ChatGPT)와 상호작용하도록 해 주는 접점
HTTP 요청(POST) + JSON 구조로 메시지 전달
모델 이름, 메시지, 파라미터를 코드로 지정
응답은 JSON 형태의 텍스트/토큰
대량 처리, 반복 처리, 자동화, 소프트웨어 통합
요청(request) 구성 요소
Base URL: 모델 서버의 접속 주소, https://api.openai.com/v1
모델 이름: gpt-5.1
API Key (인증): 사용자 신원 증명 토큰
메시지: 모델에 보낼 내용, JSON 배열로 구성
응답(response) 구성 요소
모델 출력 텍스트: 모델이 생성한 실제 답변
토큰 사용량: 과금 및 모델 내부 처리량 계산에 사용
메시지 구조(JSON)
Google AI Studio(https://aistudio.google.com/app/) 접속
왼쪽 하단에서 Get API Key 클릭
오른쪽 상단에서 API 키 만들기 클릭
새 키 만들기 창
키 이름 지정: 이름 지정
가져온 프로젝트 선택: 프로젝트 가져오기 혹은 프로젝트 만들기
오른쪽 아이콘 중 Copy API key 선택
콘솔: usethis::edit_r_environ() 실행
.Renviron 파일
GEMINI_API_KEY=your_key_here
저장
Session > Restart R 실행
library(ellmer)
chat <- chat_google_gemini(
base_url = "https://generativelanguage.googleapis.com/v1beta/",
api_key = Sys.getenv("GEMINI_API_KEY"),
model = "gemini-2.5-flash",
system_prompt = ""
)
chat$chat("서울대학교 AI융합교육학과를 소개해주세요.")library(ellmer)
chat <- chat_google_gemini(
base_url = "https://generativelanguage.googleapis.com/v1beta/",
api_key = Sys.getenv("GEMINI_API_KEY"),
model = "gemini-2.5-flash",
system_prompt = ""
)
chat$chat("서울대학교 AI융합교육학과를 소개해주세요.")서울대학교 AI융합교육학과는 4차 산업혁명 시대의 핵심 동력인 인공지능(AI) 기술과 교육 분야의 융합을 선도하기 위해 설립된 **대학원
과정**입니다. 미래 교육을 혁신하고 AI 시대에 필요한 융합형 인재를 양성하는 데 그 목표를 두고 있습니다.
다음은 AI융합교육학과에 대한 상세한 소개입니다.
---
### 서울대학교 AI융합교육학과 소개
**1. 설립 목표 및 비전**
급변하는 AI 시대에 교육의 본질을 탐구하고, AI 기술을 교육 현장에 효과적으로 적용하며, 나아가 미래 교육의 방향을 제시하고 혁신을
이끌어갈 전문가를 양성하는 것을 목표로 합니다. 인공지능 기술에 대한 깊이 있는 이해와 교육학적 통찰력을 동시에 갖춘 융합형 인재를 배출하여,
AI 시대의 새로운 교육 패러다임을 만들어갈 핵심 역할을 수행하고자 합니다.
**2. 학과의 특징 및 강점**
* **진정한 융합 교육:** 인공지능 기술(머신러닝, 딥러닝, 데이터 과학 등)과 교육학 이론(교육 심리, 교육 공학, 교육 정책, 교육
방법론 등)을 균형 있게 학습하며, 두 분야의 시너지를 극대화하는 융합적 연구를 지향합니다.
* **최고 수준의 연구 환경:** 서울대학교라는 국내 최고 교육기관의 인프라와 인공지능 및 교육 분야의 선도적인 교수진을 바탕으로 최첨단
연구와 교육을 수행합니다.
* **실제 문제 해결 능력 함양:** 이론 학습을 넘어 실제 교육 현장의 문제를 AI 기술로 해결하고, 새로운 교육 시스템 및 콘텐츠를
개발하는 실용적인 역량을 강조합니다.
* **다학제적 접근:** 컴퓨터공학, 교육학, 인문학, 사회과학 등 다양한 학문적 배경을 가진 학생들이 모여 시너지를 창출하며, 폭넓은
시야를 가진 전문가로 성장할 수 있는 기회를 제공합니다.
**3. 주요 교육 및 연구 분야**
학과에서는 다음과 같은 다양한 분야를 심도 있게 다룹니다.
* **AI 기반 교육 시스템 개발:** 지능형 튜터링 시스템, 맞춤형 학습 추천 시스템, AI 기반 평가 도구 등
* **교육 데이터 분석 및 활용:** 학습 데이터 마이닝, 교육 빅데이터 분석을 통한 학습자 행동 이해 및 교육 개선 방안 연구
* **AI 교육 콘텐츠 및 커리큘럼 개발:** AI 윤리, AI 리터러시 교육, AI 코딩 교육 등 AI 관련 교과 과정 설계 및 자료
개발
* **미래 교육 정책 및 혁신:** AI 시대의 교육 방향성 연구, 미래 학교 모델 제시, 교육 정책 제안
* **학습자 맞춤형 교육 기술:** 가상/증강현실(VR/AR)을 활용한 교육, 실감형 교육 콘텐츠 개발
* **교사의 AI 역량 강화 교육:** AI 시대 교사 역량 개발 프로그램 연구 및 운영
**4. 졸업 후 진로**
AI융합교육학과 졸업생들은 다음과 같은 다양한 분야로 진출하여 핵심적인 역할을 수행할 수 있습니다.
* **교육 기술(Ed-Tech) 기업:** AI 교육 솔루션 개발자, 에듀테크 서비스 기획자, 데이터 과학자
* **공공기관 및 연구소:** 한국교육개발원, 한국과학창의재단 등 교육 관련 연구기관의 연구원, 교육 정책 전문가
* **대학 및 학계:** AI 교육 분야 교수, 연구원
* **일반 기업:** 기업 내 AI 교육 콘텐츠 개발자, HRD(인적자원개발) 전문가
* **학교 현장:** AI 교육을 선도하는 미래 학교 교사, 교육 과정 혁신 전문가 (교원 자격증 취득 과정과는 별개)
**5. 지원 대상**
* 인공지능 기술에 대한 이해와 교육 분야에 대한 깊은 열정을 동시에 가진 분
* 미래 교육의 변화를 주도하고 새로운 교육 패러다임을 만들어가고자 하는 분
* 융합적 사고를 바탕으로 다양한 분야의 지식을 연결하고 새로운 가치를 창출하고 싶은 분
* 학부 전공과 무관하게 AI와 교육 융합 분야에 대한 연구 역량과 잠재력을 가진 분
---
서울대학교 AI융합교육학과는 AI 시대에 새로운 교육의 지평을 열어갈 리더들을 양성하는 데 최적화된 학과이며, 미래 교육에 대한 비전을 가진
분들에게 매우 매력적인 선택지가 될 것입니다.
Ollama 홈페이지 접속: https://ollama.com/
Download 클릭
모델 다운로드: Windows PowerShell 실행
ollama pull gemma3:4b실행
library(ellmer)
chat <- chat_ollama(
base_url = "http://localhost:11434",
model = "gemma3:4b",
system_prompt = ""
)
chat$chat("서울대학교 AI융합교육학과를 소개해주세요.")library(ellmer)
chat <- chat_ollama(
base_url = "http://localhost:11434",
model = "gemma3:4b",
system_prompt = ""
)
chat$chat("서울대학교 AI융합교육학과를 소개해주세요.")서울대학교 AI융합교육학과에 대해 자세히 소개해 드리겠습니다.
**1. 개요:**
* **설립:** 2023년 3월
* **위치:** 서울대학교 사범대학
* **목표:** 인공지능(AI) 기술이 교육에 미치는 영향을 이해하고, AI 기술을 활용한 혁신적인 교육 모델을 설계, 개발, 평가하는
교육 전문가를 양성하는 것을 목표로 합니다.
* **핵심 가치:** 창의적 사고, 비판적 사고, 문제 해결 능력, 윤리적 책임감, AI 역량 등을 함양합니다.
**2. 교육 과정:**
* **학부 과정:**
* **AI 기초:** AI 원리, 머신러닝, 딥러닝, 자연어 처리 등 AI 기술의 기본 원리를 학습합니다.
* **교육학 이론 및 방법:** 교육학 원리, 교육 과정 설계, 평가 방법 등 교육학의 기본 이론을 학습합니다.
* **AI 융합 교육 모델 설계:** AI 기술을 교육 현장에 적용하기 위한 다양한 융합 교육 모델을 설계하고, 실제 교육
현장에서 적용하는 방법을 학습합니다.
* **인간-AI 협업 교육:** AI 기술과 인간의 협력을 통해 학습 효과를 극대화하는 교육 모델을 연구하고 개발합니다.
* **AI 윤리 및 교육:** AI 기술의 윤리적 문제에 대한 이해를 높이고, AI 기술을 인간 중심의 교육에 활용하는 방법을
학습합니다.
* **석사 과정:** 학부 과정의 내용을 심화하고, AI 융합 교육 모델의 개발, 평가, 적용 등 고차원적인 연구를 수행합니다.
**3. 특징 및 강점:**
* **AI 전문가와 교육 전문가의 융합:** AI 기술 전문가와 교육 전문가가 협력하여 교육 과정을 설계하고 운영합니다.
* **실제 교육 현장 적용:** 교육 현장의 요구를 반영한 교육 과정을 제공하고, 실제 학교 현장에서 AI 융합 교육 모델을 적용하는
기회를 제공합니다.
* **최신 AI 기술 연구:** 최신 AI 기술 동향을 반영하여 교육에 적용할 수 있는 연구를 수행합니다.
* **다양한 연구 기회:** AI 융합 교육 모델 개발, 평가, 적용 등 다양한 연구 프로젝트에 참여할 수 있는 기회를 제공합니다.
**4. 학과 홈페이지:**
* [https://ai.so.ucla.edu/](https://ai.so.ucla.edu/)
**5. 추가 정보:**
* **문의:** [ai@so.ucla.edu](mailto:ai@so.ucla.edu)
더 궁금한 점이 있다면 언제든지 질문해주세요.

https://sangillee.snu.ac.kr/